package main

import (
	"fmt"
	"math/rand"
	"sort"
	"time"
)

func main() {
	// 1、看下面一段程序，回答问题
	// s1 := make([]int, 3, 4)
	// s2 := append(s1, 1)
	// 请问s1、s2内各有什么元素？
	// s1修改一个元素会影响s2吗？s2修改一个元素会影响s1吗？
	// s2再增加一个元素会怎么样？
	fmt.Println("=======================切片元素=====================")
	fmt.Println("s1内元素为[0 0 0]")
	fmt.Println("s2内元素为[0 0 0 1]")
	fmt.Println("经验证s1修改每一个元素都会影响s2,s2修改前三个元素会影响s1,s2修改第四个元素不会影响s1。原因是s1和s2共用底层数组，但是s1和s2的切片长度不同")
	fmt.Println("s2再增加一个元素,就超过了底层数组的容量4，底层数组会进行扩容，扩容因子是2倍，s2切片指向新的底层数组")
	// 2、有一个数组 [1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。
	fmt.Println("=======================生成一个新切片=====================")
	arr1 := [8]int{1, 4, 9, 16, 2, 5, 10, 15}
	s1 := make([]int, len(arr1))
	for i := 0; i < len(arr1)-1; i++ {
		s1[i] = arr1[i] + arr1[i+1]
	}
	fmt.Println(s1)
	// 3、数字重复统计
	// 随机产生100个整数
	// 数字的范围[-100, 100]
	// 升序输出这些生成的数字并打印其重复的次数
	fmt.Println("=======================数字重复统计=====================")
	rand1 := rand.New(rand.NewSource(time.Now().UnixNano()))
	s2 := make([]int, 0, 100)
	for i := 0; i < 100; i++ {
		num := rand1.Intn(201) - 100
		s2 = append(s2, num)
	}
	sort.Slice(s2, func(i, j int) bool {
		return s2[i] < s2[j]
	})
	// fmt.Println(s2)
	map1 := map[int]int{}
	for _, v := range s2 {
		if _, ok := map1[v]; ok {
			map1[v] += 1
		} else {
			map1[v] = 1
		}
	}
	fmt.Println("升序输出这些生成的数字并打印其重复的次数:")
	fmt.Println(map1)
}

// 批改意见
// 1. 第二题中第二个新的切片元素是数组相邻元素的和，所以切片元素长度肯定比数组长度小1
// 2. 第三题思路逻辑正确，注意看老师要求是升序还是降序